#pragma once
#include "jsonprocess.h"
#include "spline.h"

// 读取 jsonfile下的JSON 文件的函数
json readJsonFile(const std::string &filename)
{

    std::ifstream file(filename);
    if (!file.is_open())
    {
        throw std::runtime_error("Failed to open file: " + filename);
    }

    json jsonData;
    file >> jsonData;
    file.close();

    return jsonData;
}

// 获取json对象指定字段的数据
template <typename T>
T getFieldData(const json &jsonData, const std::string &fieldName)
{
    if (!jsonData.contains(fieldName))
    {
        throw std::runtime_error("Field not found in JSON.");
    }
    if constexpr (std::is_same_v<T, std::vector<double>>)
    {
        // 处理 vector<double>
        std::vector<double> vectorData;

        if (jsonData[fieldName].is_array())
        {
            for (const auto &element : jsonData[fieldName])
            {
                if (element.is_number())
                {
                    vectorData.push_back(element);
                }
                else
                {
                    throw std::runtime_error("Invalid data type in vector.");
                }
            }
        }
        else
        {
            throw std::runtime_error("Vector data not found in JSON.");
        }

        return vectorData;
    }
    else if constexpr (std::is_same_v<T, std::vector<std::vector<double>>>)
    {
        // 处理 vector<vector<double>>
        std::vector<std::vector<double>> matrixData;

        if (jsonData[fieldName].is_array())
        {
            for (const auto &row : jsonData[fieldName])
            {
                if (row.is_array())
                {
                    std::vector<double> rowData;
                    for (const auto &element : row)
                    {
                        if (element.is_number())
                        {
                            rowData.push_back(element);
                        }
                        else
                        {
                            throw std::runtime_error("Invalid data type in matrix.");
                        }
                    }
                    matrixData.push_back(rowData);
                }
                else
                {
                    throw std::runtime_error("Invalid row type in matrix.");
                }
            }
        }
        else
        {
            throw std::runtime_error("Matrix data not found in JSON.");
        }
        return matrixData;
    }
    else if constexpr (std::is_same_v<T, BoundConditionType>)
    {
        // 边界条件类型的字段处理
        return static_cast<BoundConditionType>(jsonData[fieldName].get<int>());
    }
    else
    {
        // 其他类型的字段处理
        return jsonData[fieldName].get<T>();
    }
}